Improving Deep Learning For Airbnb Search
https://gyazo.com/a3cb8970a1d0f0ce72ff20cc9cf279e9
2020/10/07
0 前説
Airbnbは2018年から検索&深層学習で3年連続KDDにアクセプトされている
いまや常連校、KDD界の花巻東か
2018 Real-time Personalization using Embeddings for Search Ranking at Airbnb
2019 Applying Deep Learning To Airbnb Search
2020 Managing Diversity in Airbnb Search
2020 Improving Deep Learning For Airbnb Search
著者グループは2019、2020*2本で半分くらい同じ
強い
論文は昨今よく見られるstate-of-the-artなモデルを提案するというものではなく、自分たちのサービス(検索機能)を改善するために深層学習をどのように扱えばよいのか、というのを試行錯誤しながら得た知見を紹介している
それが1論文に3つテーマがある
強い
To improve our chances of success, we abandoned the {download paper→ implement→ A/B test} loop
1 INTRODUCTION
検索機能における深層学習はAirbnbで重要なものになった
本論文では3つのテーマがある
DNNモデル改善
cold start
ポジションバイアス
実務よりでデータに基づいて改善していく
検索システムの改善
クエリがあって、宿泊施設(リスティング)のランキングの改善
ベースとなるのは前回の論文で紹介したモデル(NDCGを損失関数とするやつ)
最初は深層学習で成果出たが、他の研究を応用しても成果でないことに気づいた
どのようにDNNモデルを改善したかのプロセスが、他の産業にも応用できるのでは
データ観察 => 課題定義 => 解決策が効くようにモデルを構築 の繰り返し
2 OPTIMIZING THE ARCHITECTURE
自分たちのサービスにおいて適切なDNNのネットワーク構造をどのように生み出すのか
というのを試行錯誤しながらアプローチした軌跡
いろいろな研究成果を元に、オフラインテストでレイヤを追加したり、residual追加したり、バッチ正規化を取り入れたりしたがあまり効果なかった
CNNだと有効でも検索などすべてに万能ではない
隠れ層は2レイヤで十分
単純にレイヤを増やすのではなく、別のネットワークが必要な可能性もある
deep&wide, attentionも試したけどだめだった
成功モデルは特定のコンテキスト(分野)と強く結びついているのでは
「論文読んで新しいモデルを実装してA/Bテストする」というパターンを繰り返すのはやめた
成功させるために、ユーザーの行動をよく観察し、それに応じたモデルを作成するようにした
これから2章では節ごとに試行錯誤を繰り返して、どのような知見が得られたかを共有している
そして価格に焦点を当てている
安いほうがユーザー好むよねというわかりやすいテーマ
2.1 Users lead, model follows
(なんか良さげなモデルある、実装しよう => model leadsになるのかな)
まずはユーザーの問題を定量化する
2019年の論文の結果から「予約の増加だけでなく、検索結果の平均リスティング価格の低下にも関連している」
モデルの再学習によって以前のモデルが推定する価格よりも低価格になる
価格に強い関心のあるユーザーをよく学習している
モデルが推定した価格とゲストが好む価格との間にギャップがあるのでは
ゲストが見た検索結果の中央値と、ゲストが予約したリストの価格の差の分布を見る
https://gyazo.com/f875054bf850ed46ce9d43e54ca2977a
ゼロを中心とした正規分布になってない
負に偏ってるのは、低価格へのゲストの好みが偏っていること
低価格なリスティングを上位ランキングにすればよい?
価格以外は同じ条件なとき、ゲストは経済的なリスティングを選択する?
2019のモデルはこのことを学んでる?
わからない => 実験しよう
流れ的には「半ば強制的」に低価格を優先するようなモデルにして、予約数がどうなるか
「半ば強制的」=> ここの条件を緩めて(スマートにして)改善してく
2.2 Enforcing Cheaper Is Better
モデルがどのように価格を解釈しているか調査したい
ロジスティック回帰の重みやGDBTのpartial dependence graphsとかは使えない
どうしようか
入力の特徴量から価格を削除
$ D N N_{\theta}\left(u, q, l_{n o_{-} p r i c e}\right)
最終層の出力では
$ D N N_{\theta}\left(u, q, l_{n o_{-} p r i c e}\right)-\tanh (w * \mathcal{P}+b)
$ \mathcal{P}=\log \left(\frac{1+price}{1+price_{median}}\right)
tanhは、価格の上昇に対して出力スコアを反比例的に減少させることで、安い方が良いということを強制している
A/B実験
検索結果の平均価格は5.7%低下(オフラインでも低下を確認)
予約が1.5%減で大きな代償を払うことに
価格はその他の特徴量と強く相互作用している
なので価格をモデルから切り離すとフィットしない結果になった(予約数が減った)
2.3 Generalized Monotonicity
安い方が良いという直感をモデルに残しつつ、価格が他の特徴量と相互作用できるようにするためのDNNを模索する
Lattice networksは解決策になるかもだけど、移行が大変なので無理
https://gyazo.com/25f182ffedbcfe3ae06c29345d8ce06e
Figure3なモデルを提案
入力に単調減少な価格に関するPを与える
$ \mathcal{P}=\log \left(\frac{1+price}{1+price_{median}}\right)
価格の影響を受けるレイヤとそうでないレイヤに分けてみた
2.2よりも柔軟性は高いはず
A/B実験
オンラインでテストしたところ、結果は非常によく似ており、予約が 1.6%減少
このモデルの失敗は、価格に関する単調性が厳しい制約であったためか
2.4 Soft Monotonicity
2.3ではDNNのモデルは幅広く制約を表現できる
一方で別の特徴も見えた
スターエンジニアのように振る舞う = 問題を与えて、任せれば合理的な解決策を導くが、彼らに方向性を強いるとだめ(何だこの例えはw)
制約ではなくて、コンテキストで表現するようにするのがよいのでは
ここでは低価格が良いというSoftなヒントをモデルに与える
損失関数で表現する
Table2のprice_lossのくだり
https://gyazo.com/4a165d411212be235f0ce263d2998983
A/B実験
検索結果の平均価格が3.3%低下、予約でも0.67%低下
オフラインテストでは、ログで利用可能な上位の結果のみを再ランク付けして評価するという制限
2.5 Putting Some ICE
ICE : individual conditional expectation
価格引き下げの実験はパラドックスに陥ってる(価格を下げると予約数が減少する)
ベースラインモデルが価格をどのように利用しているかを解釈する必要があるが、DNNでは難しい
ICEで様子を見てみる
https://gyazo.com/8d127d5e1e5749e2f6dcfaaddf113759
1つの検索結果からリスティングを取り出し、他のすべての特徴量を不変に保ちながら価格範囲を変更し、リスティングスコアを観察した
安いほうがスコアが高い(これまでわかってたこと)
いろいろ試すと価格を下げようとして、それ以外の品質を妥協していた
2.6 Two Tower Architecture
https://gyazo.com/f875054bf850ed46ce9d43e54ca2977a
Figure1はゲストからの大事なメッセージなんだけど、解釈に問題があった
都市ごとにグループ化された平均値を計算したときに判明した(いきなり感)
(先に多角的にデータ見ろや、とはいえ結果論的にそう思っちゃうのであるあるではある)
https://gyazo.com/0105da68ae9c2a93cc3cbcb9c2b456d0
都市間でばらつきがある
ヘッドシティ(ユーザー数の多い都市?)はばらつきが小さい
テールシティは大きい
予約を支配している人気のある場所に調整された価格に焦点を当てたモデルになってる
あるある
(それでも有意な差がでちゃうのか)
https://gyazo.com/70bfab8f967b1d9805be60b9e4a6b67d
最終的なモデルはtwo tower architecture
locationをよりスマートな形で考慮できればよい
予約数の多いlocation, そうでないlocation
100次元のクエリ&ユーザー特徴量とリスティングの100次元の特徴量のユークリッド距離を計算
学習時に予約のあるリスティングと予約のないリスティングをlossで考慮する
トリプレットロスみたい
(airbnbが流行っていない)テールシティも考慮できるはず
なのでtwo towerがthreeに見える
https://gyazo.com/910df0a99695ce61ee2111c97977efad
(コードで再現性を担保してるのかな?)
2.7 Test Results
A/Bテスト結果
予約数は0.6%向上
NDCGは0.7%
検索時の平均価格は2.3%下落
トータルの収益は0.75%向上
2.8 Architecture Retrospective
DNNアーキテクチャが意図通りに動いているのか、そうでないのかは常に悩ましい問題だった
two towerは良さげ
以前のICE(再掲)
https://gyazo.com/8d127d5e1e5749e2f6dcfaaddf113759
two towerアーキテクチャのICE描画
https://gyazo.com/8e354fdff10500b63d1f3ec84b03227c
https://gyazo.com/13bf117989eb73ee54e45b2023f710dc
リスティングをクラスタにしてt-SNEで描画してみた
locationと価格等を考慮したクラスタになっているように見える
色は価格
次はゲストだけではなくホストにも貢献できるランキングに挑戦していきたい
3 IMPROVING COLD START
民泊サービスなので継続的に多くのユーザーがcold startにあたる
旅行は頻繁に行くものでもないし、同じ場所になんども行かないし
ここではアイテムのcold start問題について扱う
2.と同様にユーザーの行動調査をして問題を定式化する
モデルの評価で信頼している指標はNDCG
全体のNDCGとセグメントごとのNDCGを比較して低い箇所を見つける
登録直後のリスティングを除外すると6%のギャップが生じる(上がるはず)
3.1 Approaching Cold Start As Explore-Exploit
cold startへの取り組みの一つが探索と活用
短期的には現在あるリスティングだけに最適化したランキングにすればよいが、長期的には新しく登録されたリスティングを活用する必要がある
目先の最適化をやめて、新しいリスティングをゲストに見せて経験値(インプ、予約)を稼ぐ必要がある
最初は新しく登録されたリスティングはブーストした(ランキング上位に表示だと思う)
時間減衰あり
最適なブーストをどうするかが課題
短期的には検索が劣化するのでユーザー体験が悪くなる
長期的なユーザー体験の向上には在庫量を増やしたい
探索量を恣意的に決めても難しい、特定のlocationの需要供給に依存する
需要が多いときは探索への許容度が高い
質の高いリスティングに空室が多いときは探索させる必要ない
(「質が高い」とわかってるなら探索させる必要ないのでは)
立地、季節、ゲストに依存するので手動で最適化して決定するには無理がある
3.2 Estimating Future User Engagement
新規リスティングにないものは?
ユーザーエンゲージメント
予約数、クリック数、レビューなど
価格、場所、アメニティはある
理論的に最高のcold start問題解決法は新規リスティングのユーザーエンゲージメントを100%予測できること
探索-活用の問題から新規リスティングのユーザーエンゲージメント推定に問題を再定義
HOW
上位100ポジションからO(100M)ログ取得
$ R_{\text {real}}: 実ログから得られたランキング、ユーザーのエンゲージメントを考慮
$ D R_{\text {real}}=\log (2.0) / \log \left(2.0+R_{\text {real}}\right): discountしたランキング
$ D R_{\text {predicted}}: データセット分けてユーザーエンゲージメントを削除して予測してく
$ \left(D R_{\text {real}}-D R_{\text {predicted}}\right)^{2}: 損失関数
2つの方法で比較
本番で動いてるものからユーザーエンゲージメントをデフォルト値で設定したもの
新規リスティングに地理的に近いリスティングを平均化したもの
季節性を考慮して移動平均的なもの
3.3 Test Results
A/Bテスト
新規リスティングの予約数が14%改善
ファーストページインプレッションが14%増加
全体の予約数は0.38%増加
4 ELIMINATING POSITIONAL BIAS
ポジションバイアスを考慮し始めたのはたまたま
ブティックホテル(独創的なホテルらしい)の想定よりもパフォーマンス(NDCG)が低い
ポジションバイアスで最適なランキングになかったのでは
とはいえ様々な要因が考えられるからポジションバイアスと確定できない
文献サーベイした
4.1 Related Work
クエリqを発行するユーザuが検索結果からリスティングlを予約する確率は2つの要素に分解できる
$ P(relevant=1 \mid l, u, q): リスティングがユーザーに関連してる確率
$ P( examined =1 \mid k, u, q): 検索結果の位置kにリスティングがあった場合に、ユーザーが検討する確率
モバイルだとポジションバイアス大きいかも(画面的に)
ユーザーがリスティングを予約する確率
$ P_{booking}=P(relevant=1 \mid l, u, q) * P(examined=1 \mid k, u, q)
前のモデルが算出したポジションkに依存してしまう
理想的には $ P(relevant=1 \mid l, u, q) だけを考慮したい
傾向モデルで $ P( examined =1 \mid k, u, q) を推定する
傾向スコアの逆数で重み付けするとか
傾向モデルを構築するには検索結果にぶれを与える必要もあるが、参考文献ではそうでない方法もあったとか
4.2 Position As Control Variable
2つのハイライト
検索結果にブレは与えない(傾向スコア用)
そもそもランキングはスコアが不変でも異なる位置に表示される
カレンダーと空き状況の関係らしい
明示的な傾向スコアは導入しない
ドロップアウトによって正則化されたポジションを考慮すればOK => ここを詳しくみてく
どういう考えか
DNNの出力$ \operatorname{dnn}_{\theta}(q, u, l)を分解すると
$ \operatorname{dnn}_{\theta}(q, u, l)=\operatorname{rel}_{\theta}(q, u, l) * \operatorname{pbias}_{\theta}(q, u, l)
relθ (q,u,l): P(relevance = 1|l,u,q)を推定
pbiasθ (q,u,l): P(examination = 1|k,u,q)を推定
当然ポジションkがないので、考慮する必要がある
$ \operatorname{dnn}_{\theta}(q, u, l, k)=\operatorname{rel}_{\theta}(q, u, l, k) * \operatorname{pbias}_{\theta}(q, u, l, k)
$ \operatorname{pbias}_{\theta}(q, u, l, k)がlに依存しないようにしたい
十分な量の学習データがあればよいのではリスティングに依存しなくなる的な
(ポジションにおけるバイアス項とみなしたい)
$ \operatorname{dnn} \theta(q, u, l, k)=\operatorname{rel}_{\theta}(q, u, l, k) * \operatorname{pbias}_{\theta}(q, u, k)
(これに準ずる入力特徴量を作れば良いと思ったのだが、そうでもないらしい)
スコアリングの際、ポジションkはゼロとする
q, uはDNNでリスティングをスコアリングする際は不変 => Q, U
そうすると$ pbias_{\theta}(Q, U, 0) をなんとかやっつければよい
特定の検索で不変だから定数βとしてしまえばよい
$ \operatorname{dnn}_{\theta}(Q, U, l, 0)=\operatorname{rel}_{\theta}(Q, U, l, 0) * \beta
(強引だな)
kをゼロとした点
βに置き換えた点
4.3 Position Dropout
変数にポジションを追加して(推定できるようになれば)ポジションバイアスは防げる
当然推定にパラメータが増えたので難易度は上がる
ポジションの特徴量が常にゼロだと学習できない
NDCGはベースラインと比較すると1.3%低下
そこでドロップアウトでポジションの特徴量を正則化する(ようやく出てきた)
(学習中によしなにポジションを取り扱えるようにしたい的な)
ドロップアウト率を色々変えて2種類の方法でNDCGを計算
ポジションをゼロとしたものNDCGrel
ポジションの特徴量を保持しつつポジションバイアスの推定もするものNDCGrel+pbias.
NDCGrel+pbias − NDCGrel でポジションバイアス推定の効果を測れる
入力にポジションがあるときとないときの効果の違い
https://gyazo.com/559671da23b98f63385edae8c9309999
relθ関連性推定とポジションバイアス推定のバランスをとるためには、y軸のrelθ関連性推定があまり低下することなく、x軸のポジションバイアス推定が十分に進んでいる曲線上の点を選ぶ
(わかるようなわからんような)
(ゼロじゃなくてランダムに初期化してもよいような)
(入力特徴量にkを考慮するだけのモデルだとどうなるのだろう)
4.4 Test Results
A/Bテスト
予約数0.7%向上
収益:1.8%向上
データからユーザーが低価格を好むことは強く示唆されているので、簡単に学習できる
品質やlocationのバランスをとるのは困難
低価格がモデルに強く織り込まれてたので大変だった
最初に課題となったブティックホテルの予約数も1.1%向上した
5 CONCLUSION
所感
アプローチの仕方は誰もが見習うべき
課題の設定、DNNの解釈性を理解するための分解の仕方、トライアンドエラー
量が多い